How to split stdout and stderr of shell command output cleanly and show the latter in Vim status line?
I use Vim as my dash board and monitor/update many tables with various external(filtering) commands, run from macros. They work terrifically, except the error output (not yet perfect, though I've resolved 80% of this message integration. See p.s. for the story for such application).
For example, the following table is for "I love coffee" game:
TYPE | STAT | NAME | GOAL | DONE | TODO | S1 | S2 | S3
drink | . | Latte | 250 | 178 | 72 | . | . | .
drink | . | Cocoa | 99 | 46 | 50 | . | 3 | .
drink | . | Mocha | 250 | 190 | 40 | 12 | 8 | .
drink | . | Espresso | 30 | 0 | 20 | 10 | . | .
drink | . | Iced Latte | 54 | 8 | 37 | . | . | 9
cake | . | Egg Tart | 25 | 15 | 4 | 6 | . | .
cake | . | Tiramisu | 36 | 6 | 20 | 4 | 6 | .
cake | . | Brûlée | 11 | 0 | 9 | . | 2 | .
cake | v | Pudding | 20 | 20 | 0 | . | . | .
I have the following macro in register s:
'oV}!order-update.pl 2>/tmp/vim.err ^M:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif ^M'o
(^M
is the character ctrl-M
),
which helps update the DONE
and TODO
columns when I've touched the quantity in Store1/2/3. (And if finished, will make a v
check and move the line down to the top of historical area.)
When there is something wrong in the numbers of S1
/S2
/S3
, the redirection 2>
will spilt the stderr output from stdout output and save in vim.err
file. (not to mess up the table)
The if...endif
block will get the error output back and echo it to status line. It will print Store3 drink: 9 > 8 max
when I put 9
in S3
. (But S3
can hold a maximum of 8 drinks.)
My problem is that the last ex command line:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif
will be left in the status line if no error occur.
How can I improve it?
p.s.
Story of such an application
The above (simplified) example demonstrates how I use Vim as a quick spreadsheet, for many tables I update every day. The benefit is - I don't have to leave my favorite Vim.
With some syntax highlighting, Vim can present those tables in the way best preferable to my eyes. (depending on those values)
With related filters, every table can be correctly updated according to the values' dependency.
I've developed many syntax/filter pairs for various projects over the years. And recently I got aware that I've not yet integrate the filter's error messages into Vim's environment. Such messages will be randomly merged into the normal output and make a messed-up table. (with Vim's default setting shellredir=">%s 2>$1")
My intention is to collect filter's stderr messages and fit them in Vim's status line.
Some results have been achieved in my experiments:
The "2>vim.err" specified in macro can overrule the default "2>&1" and split the stderr into the tempfile.
The readfile() function is great to read in the whole file.
The filter had better not exit with non-zero value for minor errors detected. Such value will make Vim do more things and raise a "Hit-enter" prompt.
And fitting the stderr messages smoothly in status line is my last piece of puzzle.
vim statusbar stderr
add a comment |
I use Vim as my dash board and monitor/update many tables with various external(filtering) commands, run from macros. They work terrifically, except the error output (not yet perfect, though I've resolved 80% of this message integration. See p.s. for the story for such application).
For example, the following table is for "I love coffee" game:
TYPE | STAT | NAME | GOAL | DONE | TODO | S1 | S2 | S3
drink | . | Latte | 250 | 178 | 72 | . | . | .
drink | . | Cocoa | 99 | 46 | 50 | . | 3 | .
drink | . | Mocha | 250 | 190 | 40 | 12 | 8 | .
drink | . | Espresso | 30 | 0 | 20 | 10 | . | .
drink | . | Iced Latte | 54 | 8 | 37 | . | . | 9
cake | . | Egg Tart | 25 | 15 | 4 | 6 | . | .
cake | . | Tiramisu | 36 | 6 | 20 | 4 | 6 | .
cake | . | Brûlée | 11 | 0 | 9 | . | 2 | .
cake | v | Pudding | 20 | 20 | 0 | . | . | .
I have the following macro in register s:
'oV}!order-update.pl 2>/tmp/vim.err ^M:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif ^M'o
(^M
is the character ctrl-M
),
which helps update the DONE
and TODO
columns when I've touched the quantity in Store1/2/3. (And if finished, will make a v
check and move the line down to the top of historical area.)
When there is something wrong in the numbers of S1
/S2
/S3
, the redirection 2>
will spilt the stderr output from stdout output and save in vim.err
file. (not to mess up the table)
The if...endif
block will get the error output back and echo it to status line. It will print Store3 drink: 9 > 8 max
when I put 9
in S3
. (But S3
can hold a maximum of 8 drinks.)
My problem is that the last ex command line:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif
will be left in the status line if no error occur.
How can I improve it?
p.s.
Story of such an application
The above (simplified) example demonstrates how I use Vim as a quick spreadsheet, for many tables I update every day. The benefit is - I don't have to leave my favorite Vim.
With some syntax highlighting, Vim can present those tables in the way best preferable to my eyes. (depending on those values)
With related filters, every table can be correctly updated according to the values' dependency.
I've developed many syntax/filter pairs for various projects over the years. And recently I got aware that I've not yet integrate the filter's error messages into Vim's environment. Such messages will be randomly merged into the normal output and make a messed-up table. (with Vim's default setting shellredir=">%s 2>$1")
My intention is to collect filter's stderr messages and fit them in Vim's status line.
Some results have been achieved in my experiments:
The "2>vim.err" specified in macro can overrule the default "2>&1" and split the stderr into the tempfile.
The readfile() function is great to read in the whole file.
The filter had better not exit with non-zero value for minor errors detected. Such value will make Vim do more things and raise a "Hit-enter" prompt.
And fitting the stderr messages smoothly in status line is my last piece of puzzle.
vim statusbar stderr
According to the suggestion of @IngoKarkat, this fix::if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|else|echo|endif
will cleanly clear the code itself. A simple and perfect solution! (And thanks @romainl to put my code in the block with scrollbar. I didn't successfully try it out.)
– Charles Jie
Nov 14 '18 at 21:41
add a comment |
I use Vim as my dash board and monitor/update many tables with various external(filtering) commands, run from macros. They work terrifically, except the error output (not yet perfect, though I've resolved 80% of this message integration. See p.s. for the story for such application).
For example, the following table is for "I love coffee" game:
TYPE | STAT | NAME | GOAL | DONE | TODO | S1 | S2 | S3
drink | . | Latte | 250 | 178 | 72 | . | . | .
drink | . | Cocoa | 99 | 46 | 50 | . | 3 | .
drink | . | Mocha | 250 | 190 | 40 | 12 | 8 | .
drink | . | Espresso | 30 | 0 | 20 | 10 | . | .
drink | . | Iced Latte | 54 | 8 | 37 | . | . | 9
cake | . | Egg Tart | 25 | 15 | 4 | 6 | . | .
cake | . | Tiramisu | 36 | 6 | 20 | 4 | 6 | .
cake | . | Brûlée | 11 | 0 | 9 | . | 2 | .
cake | v | Pudding | 20 | 20 | 0 | . | . | .
I have the following macro in register s:
'oV}!order-update.pl 2>/tmp/vim.err ^M:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif ^M'o
(^M
is the character ctrl-M
),
which helps update the DONE
and TODO
columns when I've touched the quantity in Store1/2/3. (And if finished, will make a v
check and move the line down to the top of historical area.)
When there is something wrong in the numbers of S1
/S2
/S3
, the redirection 2>
will spilt the stderr output from stdout output and save in vim.err
file. (not to mess up the table)
The if...endif
block will get the error output back and echo it to status line. It will print Store3 drink: 9 > 8 max
when I put 9
in S3
. (But S3
can hold a maximum of 8 drinks.)
My problem is that the last ex command line:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif
will be left in the status line if no error occur.
How can I improve it?
p.s.
Story of such an application
The above (simplified) example demonstrates how I use Vim as a quick spreadsheet, for many tables I update every day. The benefit is - I don't have to leave my favorite Vim.
With some syntax highlighting, Vim can present those tables in the way best preferable to my eyes. (depending on those values)
With related filters, every table can be correctly updated according to the values' dependency.
I've developed many syntax/filter pairs for various projects over the years. And recently I got aware that I've not yet integrate the filter's error messages into Vim's environment. Such messages will be randomly merged into the normal output and make a messed-up table. (with Vim's default setting shellredir=">%s 2>$1")
My intention is to collect filter's stderr messages and fit them in Vim's status line.
Some results have been achieved in my experiments:
The "2>vim.err" specified in macro can overrule the default "2>&1" and split the stderr into the tempfile.
The readfile() function is great to read in the whole file.
The filter had better not exit with non-zero value for minor errors detected. Such value will make Vim do more things and raise a "Hit-enter" prompt.
And fitting the stderr messages smoothly in status line is my last piece of puzzle.
vim statusbar stderr
I use Vim as my dash board and monitor/update many tables with various external(filtering) commands, run from macros. They work terrifically, except the error output (not yet perfect, though I've resolved 80% of this message integration. See p.s. for the story for such application).
For example, the following table is for "I love coffee" game:
TYPE | STAT | NAME | GOAL | DONE | TODO | S1 | S2 | S3
drink | . | Latte | 250 | 178 | 72 | . | . | .
drink | . | Cocoa | 99 | 46 | 50 | . | 3 | .
drink | . | Mocha | 250 | 190 | 40 | 12 | 8 | .
drink | . | Espresso | 30 | 0 | 20 | 10 | . | .
drink | . | Iced Latte | 54 | 8 | 37 | . | . | 9
cake | . | Egg Tart | 25 | 15 | 4 | 6 | . | .
cake | . | Tiramisu | 36 | 6 | 20 | 4 | 6 | .
cake | . | Brûlée | 11 | 0 | 9 | . | 2 | .
cake | v | Pudding | 20 | 20 | 0 | . | . | .
I have the following macro in register s:
'oV}!order-update.pl 2>/tmp/vim.err ^M:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif ^M'o
(^M
is the character ctrl-M
),
which helps update the DONE
and TODO
columns when I've touched the quantity in Store1/2/3. (And if finished, will make a v
check and move the line down to the top of historical area.)
When there is something wrong in the numbers of S1
/S2
/S3
, the redirection 2>
will spilt the stderr output from stdout output and save in vim.err
file. (not to mess up the table)
The if...endif
block will get the error output back and echo it to status line. It will print Store3 drink: 9 > 8 max
when I put 9
in S3
. (But S3
can hold a maximum of 8 drinks.)
My problem is that the last ex command line:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|endif
will be left in the status line if no error occur.
How can I improve it?
p.s.
Story of such an application
The above (simplified) example demonstrates how I use Vim as a quick spreadsheet, for many tables I update every day. The benefit is - I don't have to leave my favorite Vim.
With some syntax highlighting, Vim can present those tables in the way best preferable to my eyes. (depending on those values)
With related filters, every table can be correctly updated according to the values' dependency.
I've developed many syntax/filter pairs for various projects over the years. And recently I got aware that I've not yet integrate the filter's error messages into Vim's environment. Such messages will be randomly merged into the normal output and make a messed-up table. (with Vim's default setting shellredir=">%s 2>$1")
My intention is to collect filter's stderr messages and fit them in Vim's status line.
Some results have been achieved in my experiments:
The "2>vim.err" specified in macro can overrule the default "2>&1" and split the stderr into the tempfile.
The readfile() function is great to read in the whole file.
The filter had better not exit with non-zero value for minor errors detected. Such value will make Vim do more things and raise a "Hit-enter" prompt.
And fitting the stderr messages smoothly in status line is my last piece of puzzle.
vim statusbar stderr
vim statusbar stderr
edited Dec 2 '18 at 7:06
Charles Jie
asked Nov 14 '18 at 15:41
Charles JieCharles Jie
707
707
According to the suggestion of @IngoKarkat, this fix::if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|else|echo|endif
will cleanly clear the code itself. A simple and perfect solution! (And thanks @romainl to put my code in the block with scrollbar. I didn't successfully try it out.)
– Charles Jie
Nov 14 '18 at 21:41
add a comment |
According to the suggestion of @IngoKarkat, this fix::if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|else|echo|endif
will cleanly clear the code itself. A simple and perfect solution! (And thanks @romainl to put my code in the block with scrollbar. I didn't successfully try it out.)
– Charles Jie
Nov 14 '18 at 21:41
According to the suggestion of @IngoKarkat, this fix:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|else|echo|endif
will cleanly clear the code itself. A simple and perfect solution! (And thanks @romainl to put my code in the block with scrollbar. I didn't successfully try it out.)– Charles Jie
Nov 14 '18 at 21:41
According to the suggestion of @IngoKarkat, this fix:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|else|echo|endif
will cleanly clear the code itself. A simple and perfect solution! (And thanks @romainl to put my code in the block with scrollbar. I didn't successfully try it out.)– Charles Jie
Nov 14 '18 at 21:41
add a comment |
2 Answers
2
active
oldest
votes
I don't think the "else|echo" is good solution to clear the status line all the time. It's ugly and not optimized for your macro.
Look at the content of your tmpfile vim.err, from stderr of your filter program. It should contains nothing if the filter doesn't see anything strange. Its empty content will help you clear the status line in the OK condition. I would rewrite your macro as (much simpler and cleaner):
'oV}!order-update.pl 2>/tmp/vim.err ^M:echo join(readfile('/tmp/vim.err'),"|") ^M'o
In addtion, I don't agree to Mr. Karkat's comment: "Macro kept in a register is only good for a single editing session". In fact, macros are kept in .viminfo and available from session to session. They will never disappear unless you assign empty to them. In my mind, macro is as powerful as mapping. And further, macro is more convenient (easier to create and maintain) than mapping. At least you can save the escaping nightmare of mapping. I would transcribe a macro to a mapping only when it's mature enough and globally useful.
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
add a comment |
Keeping a macro in a register is fine for repetitive tasks done inside a single editing session. For things you need more often, I would define a proper mapping. With Vim, the "upgrade" is simple: The macro contents become the right-hand side of a :map
command (with |
becoming <Bar>
and ^M
becoming <CR>
), which you put into your ~/.vimrc
:
:nnoremap <Leader>s 'oV}!order-update.pl ...
If you use :nnoremap <silent>
, the keys will not be printed, and you should only see the result of :echo
.
To pragmatically fix your macro, just add an else|echo|endif
to the end.
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
You can also try the "else echo" for your macro, or append| redraw
if that alone isn't enough.
– Ingo Karkat
Nov 14 '18 at 19:53
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
|
show 2 more comments
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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%2fstackoverflow.com%2fquestions%2f53303852%2fhow-to-split-stdout-and-stderr-of-shell-command-output-cleanly-and-show-the-latt%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
I don't think the "else|echo" is good solution to clear the status line all the time. It's ugly and not optimized for your macro.
Look at the content of your tmpfile vim.err, from stderr of your filter program. It should contains nothing if the filter doesn't see anything strange. Its empty content will help you clear the status line in the OK condition. I would rewrite your macro as (much simpler and cleaner):
'oV}!order-update.pl 2>/tmp/vim.err ^M:echo join(readfile('/tmp/vim.err'),"|") ^M'o
In addtion, I don't agree to Mr. Karkat's comment: "Macro kept in a register is only good for a single editing session". In fact, macros are kept in .viminfo and available from session to session. They will never disappear unless you assign empty to them. In my mind, macro is as powerful as mapping. And further, macro is more convenient (easier to create and maintain) than mapping. At least you can save the escaping nightmare of mapping. I would transcribe a macro to a mapping only when it's mature enough and globally useful.
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
add a comment |
I don't think the "else|echo" is good solution to clear the status line all the time. It's ugly and not optimized for your macro.
Look at the content of your tmpfile vim.err, from stderr of your filter program. It should contains nothing if the filter doesn't see anything strange. Its empty content will help you clear the status line in the OK condition. I would rewrite your macro as (much simpler and cleaner):
'oV}!order-update.pl 2>/tmp/vim.err ^M:echo join(readfile('/tmp/vim.err'),"|") ^M'o
In addtion, I don't agree to Mr. Karkat's comment: "Macro kept in a register is only good for a single editing session". In fact, macros are kept in .viminfo and available from session to session. They will never disappear unless you assign empty to them. In my mind, macro is as powerful as mapping. And further, macro is more convenient (easier to create and maintain) than mapping. At least you can save the escaping nightmare of mapping. I would transcribe a macro to a mapping only when it's mature enough and globally useful.
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
add a comment |
I don't think the "else|echo" is good solution to clear the status line all the time. It's ugly and not optimized for your macro.
Look at the content of your tmpfile vim.err, from stderr of your filter program. It should contains nothing if the filter doesn't see anything strange. Its empty content will help you clear the status line in the OK condition. I would rewrite your macro as (much simpler and cleaner):
'oV}!order-update.pl 2>/tmp/vim.err ^M:echo join(readfile('/tmp/vim.err'),"|") ^M'o
In addtion, I don't agree to Mr. Karkat's comment: "Macro kept in a register is only good for a single editing session". In fact, macros are kept in .viminfo and available from session to session. They will never disappear unless you assign empty to them. In my mind, macro is as powerful as mapping. And further, macro is more convenient (easier to create and maintain) than mapping. At least you can save the escaping nightmare of mapping. I would transcribe a macro to a mapping only when it's mature enough and globally useful.
I don't think the "else|echo" is good solution to clear the status line all the time. It's ugly and not optimized for your macro.
Look at the content of your tmpfile vim.err, from stderr of your filter program. It should contains nothing if the filter doesn't see anything strange. Its empty content will help you clear the status line in the OK condition. I would rewrite your macro as (much simpler and cleaner):
'oV}!order-update.pl 2>/tmp/vim.err ^M:echo join(readfile('/tmp/vim.err'),"|") ^M'o
In addtion, I don't agree to Mr. Karkat's comment: "Macro kept in a register is only good for a single editing session". In fact, macros are kept in .viminfo and available from session to session. They will never disappear unless you assign empty to them. In my mind, macro is as powerful as mapping. And further, macro is more convenient (easier to create and maintain) than mapping. At least you can save the escaping nightmare of mapping. I would transcribe a macro to a mapping only when it's mature enough and globally useful.
edited Dec 2 '18 at 4:29
answered Dec 2 '18 at 4:24
椎名梨梨花椎名梨梨花
715
715
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
add a comment |
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
Thanks for your improvement! I prefer it. It's truly much cleaner. Between macro and mapping, my way is similar to yours. I don't define mappings as often as record and refine a macro. I guess macros help 80% of my editing job.
– Charles Jie
Dec 2 '18 at 4:58
add a comment |
Keeping a macro in a register is fine for repetitive tasks done inside a single editing session. For things you need more often, I would define a proper mapping. With Vim, the "upgrade" is simple: The macro contents become the right-hand side of a :map
command (with |
becoming <Bar>
and ^M
becoming <CR>
), which you put into your ~/.vimrc
:
:nnoremap <Leader>s 'oV}!order-update.pl ...
If you use :nnoremap <silent>
, the keys will not be printed, and you should only see the result of :echo
.
To pragmatically fix your macro, just add an else|echo|endif
to the end.
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
You can also try the "else echo" for your macro, or append| redraw
if that alone isn't enough.
– Ingo Karkat
Nov 14 '18 at 19:53
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
|
show 2 more comments
Keeping a macro in a register is fine for repetitive tasks done inside a single editing session. For things you need more often, I would define a proper mapping. With Vim, the "upgrade" is simple: The macro contents become the right-hand side of a :map
command (with |
becoming <Bar>
and ^M
becoming <CR>
), which you put into your ~/.vimrc
:
:nnoremap <Leader>s 'oV}!order-update.pl ...
If you use :nnoremap <silent>
, the keys will not be printed, and you should only see the result of :echo
.
To pragmatically fix your macro, just add an else|echo|endif
to the end.
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
You can also try the "else echo" for your macro, or append| redraw
if that alone isn't enough.
– Ingo Karkat
Nov 14 '18 at 19:53
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
|
show 2 more comments
Keeping a macro in a register is fine for repetitive tasks done inside a single editing session. For things you need more often, I would define a proper mapping. With Vim, the "upgrade" is simple: The macro contents become the right-hand side of a :map
command (with |
becoming <Bar>
and ^M
becoming <CR>
), which you put into your ~/.vimrc
:
:nnoremap <Leader>s 'oV}!order-update.pl ...
If you use :nnoremap <silent>
, the keys will not be printed, and you should only see the result of :echo
.
To pragmatically fix your macro, just add an else|echo|endif
to the end.
Keeping a macro in a register is fine for repetitive tasks done inside a single editing session. For things you need more often, I would define a proper mapping. With Vim, the "upgrade" is simple: The macro contents become the right-hand side of a :map
command (with |
becoming <Bar>
and ^M
becoming <CR>
), which you put into your ~/.vimrc
:
:nnoremap <Leader>s 'oV}!order-update.pl ...
If you use :nnoremap <silent>
, the keys will not be printed, and you should only see the result of :echo
.
To pragmatically fix your macro, just add an else|echo|endif
to the end.
answered Nov 14 '18 at 16:15
Ingo KarkatIngo Karkat
132k14148198
132k14148198
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
You can also try the "else echo" for your macro, or append| redraw
if that alone isn't enough.
– Ingo Karkat
Nov 14 '18 at 19:53
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
|
show 2 more comments
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
You can also try the "else echo" for your macro, or append| redraw
if that alone isn't enough.
– Ingo Karkat
Nov 14 '18 at 19:53
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
Thank you. Is "map-silent" the only rescue to make it quiet? (I've exhausted almost all the key combinations over the years. And I found macro is something similar but is easy to "overload" for different contexts/projects. It's why I prefer macro to mapping for this case. But if there is no rescue for macro, I may try to squeeze out some function keys for this purpose.)
– Charles Jie
Nov 14 '18 at 16:56
You can also try the "else echo" for your macro, or append
| redraw
if that alone isn't enough.– Ingo Karkat
Nov 14 '18 at 19:53
You can also try the "else echo" for your macro, or append
| redraw
if that alone isn't enough.– Ingo Karkat
Nov 14 '18 at 19:53
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
I don't understand how you run out of mappings; you can have multiple keys on the left-hand side. So (some) mappings will get longer. Another alternative is a custom command; these usually are even longer, but you have command completion and no timeout on them.
– Ingo Karkat
Nov 14 '18 at 19:57
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
Thanks for your reminding. I didn't catch the point of the "else|echo" fix for the macro, but it does the trick! After a short nap and seeing your words, I tried to insert the "else|echo" part and found it works like a charm! It clears itself perfectly and as simple as I expect. Thank you both!
– Charles Jie
Nov 14 '18 at 21:02
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
For my understanding, such redundant "else|echo" part is an idiom of Vim for clearing the code left in status line. (quite special usage)
– Charles Jie
Nov 15 '18 at 11:06
|
show 2 more comments
Thanks for contributing an answer to Stack Overflow!
- 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%2fstackoverflow.com%2fquestions%2f53303852%2fhow-to-split-stdout-and-stderr-of-shell-command-output-cleanly-and-show-the-latt%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
According to the suggestion of @IngoKarkat, this fix:
:if getfsize('/tmp/vim.err')>0|echo join(readfile('/tmp/vim.err'),"|")|else|echo|endif
will cleanly clear the code itself. A simple and perfect solution! (And thanks @romainl to put my code in the block with scrollbar. I didn't successfully try it out.)– Charles Jie
Nov 14 '18 at 21:41